﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;

namespace _1241108_1241150
{
    public class MyFunction
    {
        private List<bool> kieuDuLieu = new List<bool>();

        private int n; //số lượng mẫu
        private int soCot;
        private int k;

        private DataTable tapMauHuanLuyen; //Tập mẫu huấn luyện.
        private DataTable tapThuNghiem; // tập thứ nghiệm.

        public DataTable TapThuNghiem
        {
            get { return tapThuNghiem; }
            set { tapThuNghiem = value; }
        }
        public DataTable TapMauHuanLuyen
        {
            get { return tapMauHuanLuyen; }
            set { tapMauHuanLuyen = value; }
        }
        public DataTable TapHuyenLuyenAfter;

        public int K
        {
            get { return k; }
            set { k = value; }
        }
        public int N
        {
            get { return n; }
            set { n = value; }
        }
        public int SoCot
        {
            get { return soCot; }
            set { soCot = value; }
        }

        /// <summary>
        /// Đọc file
        /// </summary>
        /// <param name="fileName">Đường dẫn tới file.</param>
        /// <returns>Chuối thông bao.</returns>
        public string ReadFile(string fileName)
        {
            this.tapMauHuanLuyen = new DataTable();
            this.tapThuNghiem = new DataTable();

            StreamReader reader = new StreamReader(fileName);

            string first = reader.ReadLine();

            string[] f = first.Split(',');

            this.n = int.Parse(f[0]);
            this.soCot = int.Parse(f[1]);
            this.k = int.Parse(f[2]);

            first = reader.ReadLine();

            string[] l = first.Split(',');
            string dataLine = reader.ReadLine();
            string[] data = dataLine.Split(',');
            this.soCot = l.Count();
            //Thiết lập cột.
            for (int i = 0; i < this.soCot; i++)
            {
                double temp;

                DataColumn dtcl;
                DataColumn dtcl2;

                if (double.TryParse(data[i], out temp))
                {
                    dtcl = new DataColumn(l[i], typeof(double));
                    dtcl2 = new DataColumn(l[i], typeof(double));
                    this.kieuDuLieu.Add(true);
                }
                else
                {
                    dtcl = new DataColumn(l[i], typeof(string));
                    dtcl2 = new DataColumn(l[i], typeof(string));
                    this.kieuDuLieu.Add(false);
                }
                //Cho phép có dữ liệu Null;
                dtcl.AllowDBNull = true;

                this.tapMauHuanLuyen.Columns.Add(dtcl);
                this.tapThuNghiem.Columns.Add(dtcl2);
            }

            //for (int i = 0; i < this.n; i++)

            while (dataLine != null)
            {
                data = dataLine.Split(',');
                bool flag = false; //cờ kiểm tra dữ liệu này là gì.

                //Kiếm tra xem trong dòng dữ liệu này có dữ liệu null hay không.
                for (int j = 0; j < this.soCot; j++)
                    if (data[j] == "?")
                        flag = true;

                // Kiểm tra nếu nó có ? thì chuyển qua bộ dữ liệu kiểm ngiệm.
                if (flag)
                {
                    DataRow rows = this.tapThuNghiem.NewRow();

                    for (int j = 0; j < data.Count(); j++)
                    {
                        //Nếu có ? bỏ qua (null).
                        if (data[j] != "?")
                        {
                            if (this.kieuDuLieu[j])
                                rows[j] = double.Parse(data[j]);
                            else
                                rows[j] = data[j];
                        }
                    }

                    this.tapThuNghiem.Rows.Add(rows);
                }
                else
                {
                    DataRow rows = this.tapMauHuanLuyen.NewRow();

                    for (int j = 0; j < data.Count(); j++)
                    {
                        if (this.kieuDuLieu[j])
                        {
                            double t =double.Parse(data[j]);

                            rows[j] = t;
                        }
                        else
                            rows[j] = data[j];
                    }

                    this.tapMauHuanLuyen.Rows.Add(rows);
                }

                dataLine = reader.ReadLine();
            }
            reader.Close();

            return "success";
        }

        public List<string> LoadTenCot()
        {
            List<string> rest = new List<string>();

            for (int i = 0; i < this.SoCot; i++)
                rest.Add(this.TapMauHuanLuyen.Columns[i].ColumnName);

            return rest;
        }

        public void KNNAlg()
        {
            KNN knn = new KNN(this.TapMauHuanLuyen, this.TapThuNghiem, this.kieuDuLieu, this.K);

            this.TapHuyenLuyenAfter = knn.KNNAlg();
        }

        //Cop1y từ dt2 qua dt1
        public void CopyDataTable(ref DataTable dt1, DataTable dt2)
        {
            dt1 = new DataTable();

            for (int i = 0; i < dt2.Columns.Count; i++)
            {
                DataColumn cl1 = new DataColumn();

                cl1.DataType = dt2.Columns[i].DataType;
                cl1.ColumnName = dt2.Columns[i].ColumnName;

                dt1.Columns.Add(cl1);
            }

            for (int j = 0; j < dt2.Rows.Count; j++)
            {
                DataRow dtr = dt1.NewRow();

                for (int i = 0; i < dt2.Columns.Count; i++)
                    dtr[i] = dt2.Rows[j][i];
                dt1.Rows.Add(dtr);
            }
        }
    }
}
